home *** CD-ROM | disk | FTP | other *** search
/ Hacks & Cracks / Hacks_and_Cracks.iso / cracking software / pgp cracker.zip / pgpcrack.c < prev    next >
C/C++ Source or Header  |  1996-04-27  |  4KB  |  143 lines

  1. /* PGPCrack v0.6b
  2.  * by Mark Miller <markm@voicenet.com>
  3.  * A program that can crack PGP conventionally encrypted files.
  4.  * Copyright (c) Mark Miller 1996
  5.  * Feel free to distribute and modify this program.  Just please keep this
  6.  * comment block on the code and make note of the modification.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include "md5.h"
  12. #include "idea.h"
  13.  
  14. void chop(char *buf);
  15. void hash(char *buf, char md5hash[16]);
  16. int ctb_check(char c);
  17. int ideacrack(char buf1[10], char buf2[8], char key[16]);
  18.  
  19. main(int argc, char *argv[])
  20. {
  21.  FILE *phrases;
  22.  FILE *ideafile;
  23.  FILE *log;
  24.  char md5hash[16];
  25.  char data[256];
  26.  char buf1[10];
  27.  char buf2[8];
  28.  char ctb;
  29.  int ctb_return;
  30.  if(argc < 3) {
  31.       fprintf(stderr, "Usage: %s [phraselist] [pgpfile] <logfile>\n", argv[0]);
  32.       exit(1);
  33.  }
  34. /* Open passphrase list */
  35.  if((phrases=fopen(argv[1], "r"))==NULL) {
  36.       fprintf(stderr, "%s: Cannot open %s\n", argv[0], argv[1]);
  37.       fclose(phrases);
  38.       exit(2);
  39.  }
  40.  if((ideafile=fopen(argv[2], "r"))==NULL) {
  41.       fprintf(stderr, "%s: Cannot open %s\n", argv[0], argv[2]);
  42.       fclose(ideafile);
  43.       exit(3);
  44.  }
  45.  fread(&ctb, 1, 1, ideafile);
  46.  ctb_return = ctb_check(ctb);
  47.  switch(ctb_return)
  48.  {
  49.   case(1)  : { fprintf(stderr, "%s: %s is a secret key\n", argv[0], argv[2]);
  50.                exit(4); }
  51.   case(-2) : { fprintf(stderr, "%s: %s is not a PGP file\n", argv[0], argv[2]);
  52.                exit(5); }
  53.   case(2)  : { fprintf(stderr, "%s: %s is not conventionally encrypted\n", argv[0], argv[2]);
  54.                exit(6); }
  55.   case(-1) : { fprintf(stderr, "%s: %s appears to be ascii-armored\n", argv[0], argv[2]);
  56.                exit(5); }
  57.   default  : { break;   }
  58.  }
  59. /* Open a file to which to write the cracked passphrase.  If none is specified,
  60.  * use stderr.
  61.  */
  62.  if(argv[3]) {
  63.       if((log=fopen(argv[3], "w"))==NULL) {
  64.            fprintf(stderr, "%s: Cannot open logfile %s.  Using stderr.\n", argv[0], argv[3]);
  65.            log=stderr;
  66.       }
  67.  } else {
  68.       log=stderr;
  69.  }
  70.  fseek(ideafile, 5, SEEK_SET);
  71.  fread(buf1, 1, 10, ideafile);
  72.  fread(buf2, 1, 8, ideafile);
  73.  fclose(ideafile);
  74.  while((fgets(data, 256, phrases))!=NULL) {
  75.       chop(data);
  76.       hash(data, md5hash);
  77.       if(ideacrack(buf1, buf2, md5hash)==0) {
  78.            fprintf(log, "PGPCrack passphrase: %s\n", data);
  79. /*           break; */
  80.       }
  81.  }
  82.  fclose(phrases);
  83.  exit(0);
  84. }
  85.  
  86. /* This function is roughly equivalent to the chop() function in Perl.  This
  87.  * chops off the last byte of the character array and if the second to last
  88.  * byte contains a '\r' character (0x0d), then that byte is also deleted.
  89.  * Passphrase lists can now be in DOS text format also.
  90.  */
  91.  
  92. void chop(char *buf)
  93. {
  94.  int i;
  95.  i = strlen(buf);
  96.  buf[i-1] = 0;
  97.  if(buf[i-2] == 13)
  98.       buf[i-2] = 0;
  99. }
  100.  
  101. void hash(char *buf, char md5hash[16])
  102. {
  103.  MD5_CTX md5;
  104.  MD5Init(&md5);
  105.  MD5Update(&md5, buf, strlen(buf));
  106.  MD5Final(md5hash, &md5);
  107. }
  108.  
  109. /* Check to make sure that byte is a valid CTB. */
  110. int ctb_check(char c)
  111. {
  112.  int i;
  113.  i = (int)c;
  114.  if(i & 0x80) {
  115.       if((i & 0x24)==36)
  116.            return 0;
  117.       else if((i & 0x14)==20)
  118.            return 1;
  119.       else
  120.            return 2;
  121.  }
  122.  if(i == 0x2d)
  123.       return -1;
  124.  return -2;
  125. }
  126.  
  127. int ideacrack(char buf1[10], char buf2[8], char key[16])
  128. {
  129.  struct IdeaCfbContext ctx; 
  130.  char plainbuf1[10];
  131.  char plainbuf2[8];
  132.  ideaCfbInit(&ctx, key); 
  133.  ideaCfbDecrypt(&ctx, buf1, plainbuf1, 10);
  134.  if((plainbuf1[6] == plainbuf1[8]) && (plainbuf1[7] == plainbuf1[9])) {
  135.       ideaCfbSync(&ctx);
  136.       ideaCfbDecrypt(&ctx, buf2, plainbuf2, 8);
  137.       if(ctb_check(plainbuf2[0]) < 0)
  138.            return 1;
  139.       return 0;
  140.  }
  141.  return 1;
  142. }
  143.